#ifndef _TCOLAABBPORO_
#define _TCOLAABBPORO_

#include<iostream>
using namespace std;

#include"tabbporo.h"

/** \file  tcolaabbporo.h
 *  \brief Esta es una clase de apoyo basada en la propiedades y operaciones posibles con una cola de tporos.
 *
 *	Autor: Óscar Toledo Ballester, 48666364c.
 *      Autor: Alejandro Serrano Cases, 74364527f
 *	
 * 	Con esta clase podemos trabajar con un gran numero de operaciones posibles con una cola, con la particularidad de que nuestra cola sera de
 *      tporos. Está compuesta por dos clases: TECAP y TColaABBPoro, ambas declaradas entre ellas como amigas.
 *      Esta clase auxiliar sirve de apoyo a la clase TABBPoro	
 */


class TECAP;
class TColaABBPoro;

/** \brief Clase TColaABBPoro.
 *
 * Clase que se corresponde con un nodo de un arbol binario de poros 
 */

class TColaABBPoro
{
		friend class TECAP;
		friend class TABBPoro;
	private:
		/** \brief TECAP que apunta al primer elemento de la cola
		*
	        * Puntero al nodo
	        */
		TECAP *primero;
		/** \brief TECAP que apunta al ultimo elemento de la cola
		*
	        * Puntero al nodo
	        */
		TECAP *ultimo;	
	public:
		 /** \brief Constructor por defecto
		 *
		 * Constructor por defecto de la clase TColaABBPoro.
	         */
		TColaABBPoro();
		/** \brief Constructor de copia
		*
		* Constructor de copia de la clase TColaABBPoro.
		* \param TColaABBPoro& Cola origen
		*/
		TColaABBPoro(const TColaABBPoro &);
		/** \brief Destructor
		*
		* Destructor de la clase TColaABBPoro.
		*/
		~TColaABBPoro();
		/** \brief Operador asignacion
		*
		* Operador asignacion de la clase TColaABBPoro.
		* \param TColaABBPoro& Cola origen
		* \return TColaABBPoro& El propio objeto (*this)
		*/
		TColaABBPoro & operator=(const TColaABBPoro &);
		/** \brief Metodo Igualdad
		*
		* Metodo de comparacion de la clase TColaABBPoro.
		* \param TColaABBPoro& Cola a comparar
		* \return bool Verdadero si son iguales
		*/
		bool operator==(const TColaABBPoro &);
		/** \brief Operador Suma
		*
		* Une en una sola cola dos.
		* \param TColaABBPoro& Segunda cola a sumar
		* \return TColaABBPoro Suma de las dos colas
		*/
		TColaABBPoro operator+(const TColaABBPoro &);
		/** \brief Metodo EsVacia
		*
		* Metodo para comprobar si esta vacia la cola.
		* \return bool Verdadero si es vacia
		*/
		bool EsVacia() const;
		/** \brief Encolar
		*
		* Encola el puntero al final arbol
		* \param TABBPoro* Puntero a encolar
		* \return bool Verdadero si encola
		*/
		bool Encolar(TABBPoro *);
		/** \brief Desencolar
		*
		* Desencola el primer elemento
		* \return bool Verdadero si desencola
		*/
		bool Desencolar();
		/** \brief Cabeza
		*
		* Devuelve el primer elemento
		* \return TABBPoro* Primer elemento
		*/
		TABBPoro * Cabeza();
		/** \brief Longitud
		*
		* Cuenta la cantidad de elementos de la cola
		* \return int Longitud de la cola
		*/
		int Longitud() const;
		/** \brief Operador de muestra
		*
		* Muestra la cola
		* \param TColaABBPoro& Cola a mostrar
		* \param ostram& Cola a mostrar
		* \return ostream& Devuelve la cola estrcuturada para mostrar
		*/
		friend ostream & operator<<(ostream &,const TColaABBPoro &);
};

/** \brief Clase TECAP.
 *
 * Clase que se corresponde con un nodo de una cola de  arboles binarios de poros 
 */


class TECAP{
		friend class TColaABBPoro;
	private:
		/** \brief TABBPoro que apunta al al arbol de la cola
		*
	        * Puntero al arbol
	        */
		TABBPoro *arbol;
		/** \brief TECAP que apunta al siguiente elemento de la cola
		*
	        * Puntero al siguiente nodo
	        */
		TECAP *sig;
	public:
		/** \brief Constructor por defecto
		*
		* Constructor por defecto de la clase TECAP.
		*/
		TECAP();
		/** \brief Constructor de copia
		*
		* Constructor de copia de la clase TABBPoro.
		* \param TECAP& Elemento origen
		*/
		TECAP(const TECAP &);
		/** \brief Destructor
		*
		* Destructor de la clase TECAP.
		*/
		~TECAP();
		/** \brief Operador asignacion
		*
		* Operador asignacion de la clase TECAP.
		* \param TECAP& TECAP origen
		* \return TECAP& El propio objeto (*this)
		*/
		TECAP & operator=(const TECAP &);
		/** \brief Metodo Igualdad
		*
		* Metodo de comparacion de la clase TECAP
		* \param TECAP& TECAP a comparar
		* \return bool Verdadero si son iguales
		*/
		bool operator==(const TECAP & ) const;
		/** \brief Metodo DesIgualdad
		*
		* Metodo de comparacion de la clase TECAP
		* \param TECAP& TECAP a comparar
		* \return bool Verdadero si son distintos
		*/
		bool operator!=(const TECAP & ) const;
		/** \brief Metodo Siguiente
		*
		* Metodo siguiente
		* \return TECAP* devuelve
		*/
		TECAP* Siguiente();
		/** \brief Arbol
		*
		* Metodo devuelve arbol
		* \return TABBPoro* devuelve
		*/
		TABBPoro* Arbol();
};

#endif
